package br.com.cfccultura.admin.control.actions.servico;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.stereotype.Component;

import br.com.cfccultura.admin.control.actions.DefaultAction;
import br.com.cfccultura.admin.control.forms.servico.ServicoForm;
import br.com.cfccultura.admin.model.enums.FormaPagamento;
import br.com.cfccultura.admin.model.enums.SituacaoConta;
import br.com.cfccultura.admin.model.enums.TipoCurso;
import br.com.cfccultura.admin.model.vo.AgendamentoProva;
import br.com.cfccultura.admin.model.vo.Aluno;
import br.com.cfccultura.admin.model.vo.Banco;
import br.com.cfccultura.admin.model.vo.ContaReceber;
import br.com.cfccultura.admin.model.vo.Matricula;
import br.com.cfccultura.admin.model.vo.OrdemServico;
import br.com.cfccultura.admin.model.vo.OrdemServicoEspecie;
import br.com.cfccultura.admin.model.vo.OrdemServicoItem;
import br.com.cfccultura.admin.model.vo.Servico;
import br.com.cfccultura.admin.model.vo.ServicoAluno;
import br.com.cfccultura.admin.view.report.ReportManager.Type;

@Component("/servico")
public class ServicoAction extends DefaultAction {
	
	public ActionForward carregarServicos(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		ServicoForm servicoForm = (ServicoForm) form;
		Integer acrescimoInformado = servicoForm.getAcrescimoServicos();
		double totalPago = 0D;
		
		Matricula matricula = null;
		AgendamentoProva prova = null;
		OrdemServico os = null;
		
		if(servicoForm.getMatricula() != null && servicoForm.getMatricula() > 0) {
			matricula = getTurmaDAO().consultarMatricula(new Matricula(servicoForm.getMatricula()));
			os = getOrdemServicoDAO().consultar(matricula.getOrdemServico().getCodigo());
			
			List<ContaReceber> debitos = getFluxoCaixaDAO().verificaDebito(os);
			
			totalPago = 0D;
			for(ContaReceber receber : debitos) {
				totalPago += receber.getValorPagamento();					
			}
			
		} else if(servicoForm.getProva() != null && servicoForm.getProva() > 0) {
			prova = getAgendamentoProvaDAO().consultar(servicoForm.getProva());
			os = getOrdemServicoDAO().consultar(prova.getOrdemServico().getCodigo());
			
			List<ContaReceber> debitos = getFluxoCaixaDAO().verificaDebito(os);
			
			totalPago = 0D;
			for(ContaReceber receber : debitos) {
				totalPago += receber.getValorPagamento();					
			}
		}
		
		if(request.getSession().getAttribute("carrinhoServicos") == null) {
			List<ServicoAluno> servicos = new ArrayList<ServicoAluno>();			
	
			if(matricula != null) {
				ServicoAluno curso = new ServicoAluno();
				curso.setCurso(matricula.getTurma().getCurso());
				
				TipoCurso tipoCurso = null;
				for(OrdemServicoItem item : os.getItems()) {
					if(item.getMatricula() != null) {
						tipoCurso = item.getTipoCurso();
						break;
					}
				}
				curso.setTipoCurso(tipoCurso);
				curso.setQtde(1);			
				servicos.add(curso);
				
				if(matricula.getTurma().getCurso().getCodigo().equals(3)) { //Renovação de CNH
					ServicoAluno servicoProva = new ServicoAluno();
					servicoProva.setCurso(matricula.getTurma().getCurso());
					servicoProva.setProva(true);
					servicoProva.setQtde(1);
					servicos.add(servicoProva);
				}			
			}
			
			if(prova != null) {
				ServicoAluno servicoProva = new ServicoAluno();
				servicoProva.setCurso(prova.getCurso());
				servicoProva.setQtde(1);			
				servicos.add(servicoProva);			
			}
			
			if(os != null) {
				for(OrdemServicoItem item : os.getItems()) {
					if(item.getServico() == null)
						continue;
					ServicoAluno servicoAluno = new ServicoAluno();
					servicoAluno.setServico(getServicoDAO().consultar(item.getServico().getCodigo())); 
					servicoAluno.setQtde(item.getQtde());
					servicoAluno.setValorUnitario(item.getValorVenda());
					servicos.add(servicoAluno);	
				}
			}
			
			request.getSession().setAttribute("carrinhoServicos", servicos);	
		}		
			
		List<ServicoAluno> servicos = (List<ServicoAluno>)request.getSession().getAttribute("carrinhoServicos");
			
		double subTotal = 0D;
		for(ServicoAluno s : servicos) {
			subTotal += s.getValorTotal();
		}
		request.setAttribute("listServicos", servicos);
		request.setAttribute("subTotal", subTotal);
		
		double total = subTotal;
		if(totalPago > 0D) {
			request.setAttribute("totalPago", totalPago);
			request.setAttribute("saldo", total - totalPago);
			total = total - totalPago;
		}
		
		if(acrescimoInformado > 0) {
			double acrescimo = (acrescimoInformado / 100.0) * total;
			total = total + acrescimo;
			request.setAttribute("acrescimoServicos", acrescimoInformado);
		}
		request.setAttribute("total", total);
		
		return mapping.findForward("servicos");
	}
	
	public ActionForward incluirServico(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		ServicoForm servicoForm = (ServicoForm) form;
		
		Servico vo = getServicoDAO().consultar(servicoForm.getServico());
		
		List<ServicoAluno> servicos = (List<ServicoAluno>) request.getSession().getAttribute("carrinhoServicos");
		boolean jaIncluido = false;
		for(ServicoAluno servico : servicos) {
			if(servico.getServico() != null && servico.getServico().getCodigo().equals(vo.getCodigo())) {
				servico.setQtde(servico.getQtde() + servicoForm.getQtdeServico());
				jaIncluido = true;
				break;
			}
		}
		
		if(!jaIncluido) {
			ServicoAluno servico = new ServicoAluno();
			servico.setServico(vo);
			servico.setDescricao(vo.getDescricao());
			servico.setQtde(servicoForm.getQtdeServico());
			servico.setValorUnitario(vo.getValorVenda());			
			servicos.add(servico);
		}
		
		return null;
	}
	
	public ActionForward excluirServico(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		ServicoForm servicoForm = (ServicoForm) form;
	
		List<ServicoAluno> servicos = (List<ServicoAluno>) request.getSession().getAttribute("carrinhoServicos");
		servicos.remove(servicoForm.getServico().intValue());
		
		return null;
	}
	
	public ActionForward realizarPagamento(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		ServicoForm servicoForm = (ServicoForm) form;
		
		Aluno aluno = null;
		Matricula matricula = null;
		AgendamentoProva prova = null;
		Integer codigoOrdemServico = null;
		OrdemServico os = null;
		
		if(servicoForm.getMatricula() != null && servicoForm.getMatricula() > 0) {
			matricula = getTurmaDAO().consultarMatricula(new Matricula(servicoForm.getMatricula()));
			aluno = matricula.getAluno();
			codigoOrdemServico = matricula.getOrdemServico().getCodigo();
			
			os = getOrdemServicoDAO().consultar(codigoOrdemServico);
		}
		
		if(servicoForm.getProva() != null && servicoForm.getProva() > 0) {
			prova = getAgendamentoProvaDAO().consultar(servicoForm.getProva());
			aluno = prova.getAluno();
			codigoOrdemServico = prova.getOrdemServico().getCodigo();
			
			os = getOrdemServicoDAO().consultar(codigoOrdemServico);
		}
		
		if(servicoForm.getAluno() != null && servicoForm.getAluno() > 0) {
			aluno = getAlunoDAO().consultar(servicoForm.getAluno());
		}
		
		if(os == null) {
			os = new OrdemServico();
			os.setCadastro(new Date());
			os.setUsuarioSistema(getUsuario(request));
			if(aluno != null)
				os.setAluno(aluno);
			
			List<ServicoAluno> servicos = (List<ServicoAluno>) request.getSession().getAttribute("carrinhoServicos");
			for(ServicoAluno sa : servicos) {
				OrdemServicoItem item = new OrdemServicoItem();
				item.setServico(sa.getServico());
				item.setQtde(sa.getQtde());
				item.setUsuarioSistema(getUsuario(request));
				item.setValorCusto(sa.getServico().getValorCusto());
				item.setValorVenda(sa.getServico().getValorVenda());
				os.getItems().add(item);
			}
			
		}
		
		for(OrdemServicoEspecie especie : os.getEspecies()) {
			if(especie.getFormaPagamento().equals(FormaPagamento.ABERTO)) {
				ContaReceber receber = new ContaReceber();
				receber.setOrdemServicoEspecie(especie);
				List<ContaReceber> temp = getFluxoCaixaDAO().consulta(receber);
				getFluxoCaixaDAO().excluir(temp.get(0));
				break;
			}
		}
		
		FormaPagamento formaPagamento = FormaPagamento.setValue(servicoForm.getFormaPagamento());
		Double valorPago = getDecimalFormat().parse(servicoForm.getValorPagamento()).doubleValue();
		
		List<ContaReceber> debitos = getFluxoCaixaDAO().verificaDebito(os);
		
		double totalPago = 0D;
		for(ContaReceber receber : debitos) {
			totalPago += receber.getValorPagamento();					
		}
		
		OrdemServicoEspecie especie = new OrdemServicoEspecie();
		especie.setFormaPagamento(formaPagamento);
		especie.setOrdemServico(os);
		especie.setValor(valorPago);
		if(formaPagamento.equals(FormaPagamento.CHEQUE)) {
			especie.setBanco(new Banco(servicoForm.getBanco()));
			especie.setAgencia(servicoForm.getAgencia());
			especie.setConta(servicoForm.getConta());
			especie.setCheque(servicoForm.getCheque());
			especie.setDataCheque(getDateFormat().parse(servicoForm.getDataCheque()));
		}
		especie.setUsuarioSistema(getUsuario(request));		

		if(os.getCodigo() != null) {
			getOrdemServicoDAO().incluirEspecie(os.getCodigo(), especie);
		} else {
			os.getEspecies().add(especie);
			getOrdemServicoDAO().incluir(os);
		}
		 
		ContaReceber conta = new ContaReceber();
		conta.setOrdemServicoEspecie(especie);
		
		if(matricula != null) {
			conta.setDescricao(matricula.getTurma().getCurso().getNome() + " (curso)");
		} else if(prova != null) {
			conta.setDescricao(prova.getCurso().getNome() + " (prova)");
		} else {
			if(aluno != null)
				conta.setDescricao("Venda Serviços - CPF: " + aluno.getCpf());
			else
				conta.setDescricao("Venda Serviços - Avulso");
		}
		
		if(especie.getFormaPagamento().equals(FormaPagamento.DINHEIRO)) {
			conta.setPagamento(new Date());
			conta.setVencimento(new Date());
		} else if(especie.getFormaPagamento().equals(FormaPagamento.CHEQUE)) {
			conta.setVencimento(getDateFormat().parse(servicoForm.getDataCheque()));
		}
		
		conta.setSituacao(SituacaoConta.PAGO);
		conta.setValorPagamento(valorPago);
		
		conta.setUsuarioSistema(getUsuario(request));
		getFluxoCaixaDAO().incluir(conta);
		
		request.getSession().removeAttribute("carrinhoServicos");
		
		request.getSession().setAttribute("reportType", Type.RECIBO);
		
		HashMap<String, Object> params = new HashMap<String, Object>();
		params.put("aluno", aluno);
		params.put("matricula", matricula);
		params.put("valorPago", valorPago);
		params.put("creditos", totalPago);
		
		request.getSession().setAttribute("jasperParams", params);
		request.getSession().setAttribute("jasperDs", os.getItems());
		
		return null;
	}
}
